package com.zenithmind.task.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.task.pojo.entity.TaskDependency;
import com.zenithmind.task.pojo.query.TaskDependencyQuery;
import com.zenithmind.task.pojo.vo.TaskDependencyVO;

import java.util.List;

/**
 * 任务依赖服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface TaskDependencyService extends IService<TaskDependency> {

    /**
     * 分页查询任务依赖列表
     *
     * @param query 查询条件
     * @param userId 当前用户ID
     * @return 分页结果
     */
    PageResult<TaskDependencyVO> getTaskDependencyPage(TaskDependencyQuery query, String userId);

    /**
     * 根据ID查询任务依赖详情
     * 
     * @param id 依赖ID
     * @param userId 当前用户ID
     * @return 依赖详情
     */
    TaskDependencyVO getTaskDependencyById(String id, String userId);

    /**
     * 创建任务依赖
     * 
     * @param taskDependency 依赖信息
     * @param userId 创建者ID
     * @return 创建结果
     */
    Boolean createTaskDependency(TaskDependency taskDependency, String userId);

    /**
     * 更新任务依赖
     * 
     * @param taskDependency 依赖信息
     * @param userId 操作者ID
     * @return 更新结果
     */
    Boolean updateTaskDependency(TaskDependency taskDependency, String userId);

    /**
     * 删除任务依赖
     * 
     * @param id 依赖ID
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean deleteTaskDependency(String id, String userId);

    /**
     * 批量删除任务依赖
     * 
     * @param ids 依赖ID列表
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean batchDeleteTaskDependencies(List<String> ids, String userId);

    /**
     * 查询任务的前置依赖
     * 
     * @param taskId 任务ID
     * @param userId 当前用户ID
     * @return 前置依赖列表
     */
    List<TaskDependencyVO> getTaskPredecessors(String taskId, String userId);

    /**
     * 查询任务的后续依赖
     * 
     * @param taskId 任务ID
     * @param userId 当前用户ID
     * @return 后续依赖列表
     */
    List<TaskDependencyVO> getTaskSuccessors(String taskId, String userId);

    /**
     * 检查依赖循环
     * 
     * @param predecessorId 前置任务ID
     * @param successorId 后续任务ID
     * @return 是否存在循环依赖
     */
    Boolean checkCircularDependency(String predecessorId, String successorId);

    /**
     * 获取任务依赖路径
     * 
     * @param taskId 任务ID
     * @param userId 当前用户ID
     * @return 依赖路径
     */
    List<List<TaskDependencyVO>> getTaskDependencyPath(String taskId, String userId);
}
